'use strict'
let { message, common } = require('../model');
const auth = require('../utile/auth');

// 显示首页
let index_fn = async (ctx, next) => {
    let username = ctx.session.userName;
    let userIds = [];
    // 所有的说说
    let msgs = JSON.parse(JSON.stringify(await message.findAll({
        order: [
            ['id', 'desc']
        ]
    })));

    // 查询出来的说说的id（如果有分页，则应该是10条说说的id）
    let msgIds = [];

    msgs.forEach(item => {
        msgIds.push(item.id);
        userIds.push(item.fromUserId);
    });

    // 所有的吐槽（如果有分页，可以根据查出来的说说的id，来查询所对应的所有的吐槽）
    let comments = JSON.parse(JSON.stringify(await common.findAll({
        where: {
            msgId: msgIds
        }
    })));

    comments.forEach(item => {
        userIds.push(item.fromUserId);
    });

    let userAll = await User.findAll({
        where: {
            id: userIds
        }
    });

    // 遍历所有的评论，给每一个评论的fromUserId加上用户名称
    comments.forEach(item => {
        let userInfo = userAll.filter(row => {
            return item.fromUserId === row.id;
        })[0];
        item.comUserName = userInfo === undefined ? '匿名' : userInfo.username;
    });

    // 组合成上下级关系
    msgs.forEach(msg => {
        let sayComments = comments.filter(item => {
            return item.msgId === msg.id;
        });
        let userInfo = userAll.filter(row => {
            return msg.fromUserId === row.id;
        })[0];
        msg.msgUserName = userInfo === undefined ? '匿名' : userInfo.username;
        msg.comments = sayComments;
    });

    console.log(msgs);
    let obj = {
        username,
        msgs
    };
    ctx.render('index.html', obj);
};


// 注销
let logout_fn = async (ctx, next) => {
    ctx.session = null;
    ctx.body = { code: 200, msg: '注销成功' };
};

// 说说调用的方法
let say_fn = async (ctx, next) => {
    let sayMsg = ctx.request.body.sayMsg || '';
    let userId = ctx.session.userId;
    let say = await message.create({
        fromUserId: userId,
        content: sayMsg
    });

    let data = JSON.stringify(say);

    ctx.body = { code: 200, data, msg: '发表说说成功' };
};

// 吐槽一下调用的方法
let comment_fn=async (ctx,next)=>{
    let commentMsg=ctx.request.body.commentMsg || '';
    let msgId=ctx.request.body.msgId || '';
    let fromUserId=ctx.session.userId;

    // 将评论的信息插入数据库
    let comment=await Comment.create({
        fromUserId:fromUserId,
        msgId:msgId,
        content:commentMsg
    });

    // 因为要查找说说的用户信息，所以这里先查询了说说的信息，拿到发表说说的用户的id
    let msg=await Message.findOne({
        where:{
            id:msgId
        }
    });

    let toUserId=msg===undefined?'0':msg.fromUserId;

    // 在用户表里查询发表说说的用户的信息和发表评论的用户的信息
    let users=await User.findAll({
        where:{
            id:[fromUserId,toUserId]
        }
    });

    // 根据评论者的id，查询到说说的用户信息
    var fromUserInfo=JSON.parse(JSON.stringify(users.filter(user=>{
        return user.id===fromUserId;
    })[0]));

    // 根据发表说说的id，查询到评论的用户信息
    var toUserInfo=JSON.parse(JSON.stringify(users.filter(user=>{
        return user.id===toUserId;
    })[0]));


    let data=JSON.parse(JSON.stringify(comment));

    // 将说说的用户名称和评论的用户名称挂载到数据信息里面，返回前端
    data.fromUserName=fromUserInfo.username;
    data.toUserName=toUserInfo.username;

    ctx.body={code:200,data,msg:'吐槽成功'};
}

module.exports={
    '/': ['get',auth, index_fn],
    '/logout': ['post',auth, logout_fn],
    '/say': ['post', say_fn],
    '/comment': ['post', comment_fn]
}